package com.hotelvip.service.impl;

import com.hotelvip.common.annotation.RequiredLog;
import com.hotelvip.common.exception.ServiceException;
import com.hotelvip.common.pojo.PageObject;
import com.hotelvip.dao.SysRoleMapper;
import com.hotelvip.dao.SysRoleMenuMapper;
import com.hotelvip.entity.SysRole;
import com.hotelvip.entity.SysRoleMenu;
import com.hotelvip.service.SysRoleService;
import com.hotelvip.vo.CheckBox;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * 用户权限impl
 * @author Lzh
 * @date 2020/12/22 9:48
 */
@Service
@Slf4j
public class SysRoleServiceImpl implements SysRoleService {
    @Autowired
    private SysRoleMapper sysRoleMapper;
    @Autowired
    private SysRoleMenuMapper sysRoleMenuMapper;

    /**
     * 查询角色名称与id
     * @return
     */
    @Transactional(readOnly = true)
    @RequiredLog(operation = "查询角色名称与id")
    @Override
    public List<CheckBox> findRoles() {
        return sysRoleMapper.findRoles();
    }

    /**
     * 	基于角色id查询角色以及角色对应的菜单id
     * @param id
     * @return
     */
    @Transactional(readOnly = true)
    @RequiredLog(operation = "查询角色对应的菜单id")
    @Override
    public SysRoleMenu findById(Integer id) {
        //1.参数校验
        if (id == null || id<0){
            throw new ServiceException("id信息有误");
        }
        //2.基于id查询角色自身信息
        SysRoleMenu sysRoleMenu=sysRoleMapper.findById(id);
        log.info("sysRoleMenu="+sysRoleMenu);
        if(sysRoleMenu==null)
            throw new ServiceException("没有找到对应记录");
        return sysRoleMenu;
    }

    /**
     * 	更新角色自身信息以及角色和菜单关系数据
     * @param entity
     * @param menuIds
     * @return
     */
    @Transactional(rollbackFor = RuntimeException.class)
    @RequiredLog(operation = "更新用户角色菜单关系")
    @Override
    public int updateObject(SysRole entity, Integer[] menuIds) {
        //1.参数校验
        if(entity==null)
            throw new IllegalArgumentException("保存对象不能为空");
        if(StringUtils.isEmpty(entity.getName()))
            throw new IllegalArgumentException("角色名不能为空");
        if(menuIds==null||menuIds.length==0)
            throw new IllegalArgumentException("需要为角色指定权限");
        //2.更新角色自身信息
        int rows=sysRoleMapper.updateObject(entity);
        if(rows==0)
            throw new ServiceException("记录可能已经不存在");
        //3.更新角色菜单关系数据
        //3.1删除原有关系数据
        //sysRoleMenuDao.deleteObjectByRoleId(entity.getId());
        sysRoleMenuMapper.deleteObjects("role_id",entity.getId());
        //3.2添加新的关系数据
        sysRoleMenuMapper.insertObjects(entity.getId(), menuIds);
        //4.返回结果
        return rows;
    }

    /**
     * 	保存角色自身信息以及角色和菜单关系数据
     * @param entity
     * @param menuIds
     * @return
     */
    @Transactional(rollbackFor = RuntimeException.class)
    @RequiredLog(operation = "保存用户角色菜单关系")
    @Override
    public int saveObject(SysRole entity, Integer[] menuIds) {
        //1.参数校验
        if(entity==null)
            throw new IllegalArgumentException("保存对象不能为空");
        if(StringUtils.isEmpty(entity.getName()))
            throw new IllegalArgumentException("角色名不能为空");
        if(menuIds==null||menuIds.length==0)
            throw new IllegalArgumentException("需要为角色指定权限");
        //2.保存角色自身信息
        int rows=sysRoleMapper.insertObject(entity);
        //3.保存角色菜单关系数据
        sysRoleMenuMapper.insertObjects(entity.getId(), menuIds);
        //4.返回结果
        return rows;
    }
    /**
     * 	查询角色自身信息以及分页信息
     * @param name
     * @param pageCurrent
     * @return
     */
    @Transactional(readOnly = true)
    @RequiredLog(operation = "查询角色信息列表")
    @Override
    public PageObject<SysRole> findPageObjects(String name, Long pageCurrent) {
        //1.参数校验
        if (name==null ||name==""){
            throw new ServiceException("名字不能为空");
        }
        if (pageCurrent==null || pageCurrent<=0){
            throw new ServiceException("请输入正确的当前页面值");
        }

        //2.统计总记录数
        long rowCount=sysRoleMapper.getRowCount(name);
        if(rowCount==0)throw new ServiceException("记录不存在");
        //3.查询当前页记录并进行封装
        int pageSize=2;
        long startIndex=(pageCurrent-1)*pageSize;
        List<SysRole> records=sysRoleMapper.findPageObjects(name, startIndex, pageSize);
        return PageObject.setPageObject(rowCount, records, Long.valueOf(pageSize), pageCurrent);
    }
}
